﻿using Acaweb.Data.Contracts;
using Acaweb.Model.Entities;
using Acaweb.Model.Entities.DatosCompuestos;
using Acaweb.Componentes.Contracts;
using System.Collections.Generic;
using System.Linq;

namespace Acaweb.Componentes
{
    public class SolicitudesService : BaseService, ISolicitudesService
    {
        private ISolicitudesDao _SolicitudesDao;
        private IEmpresasDao _EmpresasDao;
        private IPracticantesDao _PracticantesDao;
        private IEstudiantesDao _EstudiantesDao;

        public IEstudiantesDao EstudiantesDao
        {
            get { return _EstudiantesDao; }
            set { _EstudiantesDao = value; }
        }

        public IPracticantesDao PracticantesDao
        {
            get { return _PracticantesDao; }
            set { _PracticantesDao = value; }
        }

        public ISolicitudesDao SolicitudesDao
        {
            get { return _SolicitudesDao; }
            set { _SolicitudesDao = value; }
        }
        
        public IEmpresasDao EmpresasDao
        {
            get { return _EmpresasDao; }
            set { _EmpresasDao = value; }
        }

        public IList<Solicitudes> GetAll()
        {
            return SolicitudesDao.GetAll();
        }

        public Solicitudes GetById(int Id)
        {
            return SolicitudesDao.GetById(Id);
        }

        public IList<Solicitudes> GetByEstado(EstadoSolicitud Estado)
        {
            List<Solicitudes> Lista = SolicitudesDao.GetByEstado(Estado).ToList();

            if (Estado != EstadoSolicitud.Registrada)
            {
                Lista.ForEach(t => t.PracticanteActual = PracticantesDao.GetById(t.IdPracticanteActual));
                Lista.ForEach(t=>t.PracticanteActual = DeepLoad(t.PracticanteActual));
            }

            return Lista;
        }

        public IList<Solicitudes> GetByPlanEstudio(int CodigoPlan)
        {
            List<Solicitudes> Lista = SolicitudesDao.GetByPlanEstudio(CodigoPlan).ToList();
            

            return Lista;
        }

        public void Insert(Solicitudes Solicitud)
        {
            if (EmpresasDao.GetById(Solicitud.NitEmpresa) == null)
            {
                EmpresasDao.Save(Solicitud.Empresa);
            }

            Solicitud.Estado = EstadoSolicitud.Registrada;
            SolicitudesDao.Save(Solicitud);
        }

        private Practicantes DeepLoad(Practicantes Practicante)
        {
            Practicante.Estudiante = EstudiantesDao.GetByCodigoEstudiante(Practicante.CodigoEstudiante);
            return Practicante;
        }

        public void Update(Solicitudes Solicitud)
        {
            if (Solicitud.Estado == EstadoSolicitud.Procesada && Solicitud.PracticanteActual != null)
            {
                PracticantesDao.Save(Solicitud.PracticanteActual);
                Solicitud.IdPracticanteActual = Solicitud.PracticanteActual.IdPracticante;
                SolicitudesDao.Update(Solicitud);
            }

            //SolicitudesDao.Update(Solicitud);

        }
    }
}
